package com.fruit.service;

import java.io.Serializable;
import java.util.List;

import com.fruit.dao.BaseDao;
import com.fruit.system.model.Pager;

public interface BaseService<T>
{
	/**
	 * 保存一条记录
	 * @param t
	 * @return
	 */
	public Object saveEntity(T t);
	/**
	 * 增加或者更新 1:数据库没有该记录增加 ; 2:数据库已有该记录则更新
	 * @param t
	 * @return
	 */
	public void saveOrUpdateEntity(T t);
	/**
	 * 删除操作
	 * @param t 要删除的记录
	 */
	public void deleteEntity(T t);
	public void updateEntity(T t);
	public T loadEntity(Serializable id);
	public T getEntity(Serializable id);
	/**
	 * 查询单一记录
	 * @param hql
	 * @param values
	 * @return
	 */
	public Object findUniqueResultByHql(String hql,Object...values);
	
	public List<T> findAllEntity();
	
	/**
	 * 分页查询
	 * @return
	 */
	public Pager<T> findAllEntityByPager();
	/**
	 * 带有条件的分页查询
	 * @param hql
	 * @param values
	 * @return
	 */
	public Pager<Object> findEntityByPager(String hql,Object...values);
	/**
	 * 执行批量更新
	 * @param hql hql语句
	 * @param values 参数列表
	 */
	public void batchEntityByHql(String hql,Object...values);
	
	/**
	 * 原生sql查询
	 * @param sql 原始sql语句
	 * @param values  ?的参数值
	 * @return List<T>
	 */
	public List<T> executeFindSql(String sql,Object...values);
	/**
	 * 原生sql查询
	 * @param clz 若果当前查询的不是映射到数据库中的实体，此查询的查询结果将会将其封装成指定的clz
	 * @param sql 原生sql语句
	 * @param values 参数值
	 * @return List<T> 集合类型
	 */
	public <E> List<E> executeFindSql(Class<E> clz,String sql,Object...values);
	/**
	 * 原生sql更新
	 * @param sql 原生sql语句
	 * @param values 参数值，可变参数
	 */
	public void executeUpdateSql(String sql,Object...values);
	/**
	 * 原生sql分页查询，同不分页查询参数一样
	 * @param sql
	 * @param values
	 * @return
	 * @see <a>executeFindSql</a>
	 */
	public Pager<T> executeFindSqlByPager(String sql,Object...values);
	/**
	 * 原生sql分页查询
	 * @param clz 若果当前查询的不是映射到数据库中的实体，此查询的查询结果将会将其封装成指定的clz
	 * @param sql 原生sql语句
	 * @param values 参数值
	 * @return
	 */
	public <E> Pager<E> executeFindSqlByPager(Class<E> clz,String sql,Object...values);
	
	public BaseDao<T> getEntityDao();
}
